using System.Data;
using Microsoft.Data.SqlClient;

namespace Admin2025.Infrastructure.Data;

public class DapDbContext : IDisposable
{
  private readonly string _connectionString;
  // IDbConnection：用于管理数据库连接，提供打开和关闭连接的方法，以及执行 SQL 命令的能力。
  private IDbConnection? _connection;
  // IDbTransaction：用于管理数据库事务，提供开始、提交和回滚事务的方法。
  private IDbTransaction? _transaction;

  public DapDbContext(string connectionString)
  {
    _connectionString = connectionString;
  }

  // 获取数据库连接。如果连接不存在或未打开，则新建并打开一个 SqlConnection。
  public IDbConnection Connection
  {
    get
    {
      if (_connection == null || _connection.State != ConnectionState.Open)
      {
        _connection = new SqlConnection(_connectionString);
        _connection.Open();
      }
      return _connection;
    }
  }
  // 获取当前的事务对象
  public IDbTransaction? GetCurrentTransaction()
  {
    return _transaction;
  }

  // 开启数据库事务（如果还没开启）。
  public void BeginTransaction()
  {
    if (_transaction == null)
    {
      _transaction = Connection.BeginTransaction();
    }
  }

  // 提交当前事务，并释放资源
  public void CommitTransaction()
  {
    if (_transaction != null)
    {
      _transaction.Commit();
      _transaction.Dispose();
      _transaction = null;
    }
  }

  // 回滚当前事务，并释放资源
  public void RollbackTransaction()
  {
    if (_transaction != null)
    {
      _transaction.Rollback();
      _transaction.Dispose();
      _transaction = null;
    }
  }

  // 实现 IDisposable 接口，确保用完后能正确释放数据库连接和事务资源，防止资源泄漏
  public void Dispose()
  {
    if (_transaction != null)
    {
      _transaction.Dispose();
      _transaction = null;
    }

    if (_connection != null)
    {
      if (_connection.State == ConnectionState.Open)
      {
        _connection.Close();
      }
      _connection.Dispose();
      _connection = null;
    }
  }
}

